/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package mrp.entity;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;
/**
 *
 * @author root
 */
public class GestorBaseDatos {

    private Statement stm;
    private ResultSet rs;
    private Connection con;
    private PreparedStatement pstm;
    
    private String servidor, puerto, basedatos, usuario, clave;
    
    public GestorBaseDatos() {
        
        this.setServidor("localhost");
        this.setPuerto("5432");
        this.setBasedatos("DBUsuariosEgoZapateria");
        this.setUsuario("login");
        this.setClave("login");
        
    }

    @Override
    protected void finalize() throws Throwable {
         System.out.println("finalizado-----(");
        super.finalize();
    }
    
    
    ///// getters and setters
    
    public String getBasedatos() {
        return basedatos.trim();
    }

    public void setBasedatos(String basedatos) {
        this.basedatos = basedatos.trim();
    }

    public String getClave() {
        return clave.trim();
    }

    public void setClave(String clave) {
        this.clave = clave.trim();
    }

    public String getPuerto() {
        return puerto.trim();
    }

    public void setPuerto(String puerto) {
        this.puerto = puerto.trim();
    }

    public String getServidor() {
        return servidor.trim();
    }

    public void setServidor(String servidor) {
        this.servidor = servidor.trim();
    }

    public String getUsuario() {
        return usuario;
    }

    public void setUsuario(String usuario) {
        this.usuario = usuario.trim();
    }
    

    
    /////////////////////////metodos conectar y desconectar base

    public boolean conectarBase()
    {
        try
        {
            System.out.println("datos modificadosssss------<<<<<< "+this.getUsuario()+" ----- "+this.getClave()+" base datos "+this.getBasedatos());
            Class.forName("org.postgresql.Driver");          
            con = DriverManager.getConnection("jdbc:postgresql://"+this.getServidor()+":"+this.getPuerto()+"/"+this.getBasedatos(),this.getUsuario().toString(),this.getClave().toString());          
//            System.out.println("jdbc:postgresql://"+this.getServidor()+":"+this.getPuerto()+"/"+this.getBasedatos()+","+this.getUsuario()+","+this.getClave()+"<<--fin");
            stm=con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
            //ScrollableTableModel modelo;
            return true;        
        }
        catch(SQLException sql)
        {
            System.out.println("Error SQL "+sql);
            return false;
        }
        catch(ClassNotFoundException clas)
        {
            System.out.println("Error Class "+clas);
            return false;
        }
    }
    
    public void desconectar()
    {
        try
        {
            stm.close();
            con.close();
             System.out.println("Base de datos desconectada");
        }
        catch(Exception e)
        {
            System.out.println("no se pudo desconectar la Base por: "+e);
        }
        
    }
    /////////////////////fin metodos conectar y desconectar base
    public String generaCodigo(String tabla,String sufijo)
    {
        ///////Metodo para obtener los primary Key que son Text de cada tabla y generar el siguiente, debido a que 
        ////// los primary key de la base de datos la mayoria son Text y son en secuencia numerica
        //////por lo que la tabla TablaIndice, almacena el último ID ingresado
        List list=this.select("select ActualPrimaryKeyTabla from TablaIndice where NombreTabla = \'"+tabla+"\'");
        String codigo=(list.get(0).toString()).trim();
        if(codigo.contains("-"))
            codigo=codigo.substring(3);
                 
        try{
            //System.out.println("codigo.substring ////// "+codigo);
            int numero=Integer.parseInt(codigo.trim());
            numero++;
            codigo= sufijo.trim()+"-"+(""+numero).trim();            
        }
        catch(Exception e)
        {
            System.out.println("Error en metodo generarCodigo "+e);
            codigo=null;
            return null;
        }
        return codigo;
    }
    
    public List<String> select(String query)
    {
        List<String> list = new ArrayList<String>();
        int columnas;
        if(conectarBase())
        {
            System.out.println("si llega hasta aca query = "+query);
            
            try
            {          
                System.out.println("Resultado -1");
                rs=stm.executeQuery(query);
                System.out.println("Resultado 0");
                ResultSetMetaData rsmd= rs.getMetaData();
                System.out.println("Resultado 1");
                columnas=rsmd.getColumnCount();
                System.out.println("Resultado 2");
                
                while(rs.next())
                {

                    for(int j=1;j<=columnas;j++)
                    {
                        list.add(rs.getArray(j).toString());
                        System.out.println("Resultado 5 ---->>> "+ rs.getArray(j).toString());
                    }
                }
                desconectar();
                //System.out.println("Resultado "+resultado.get(1));
                
                return list;
            }
            catch(Exception e)
            {
                desconectar();
                System.out.println("Se presentó el siguiente Error: "+e);
                return null;
            }
        }
        return null;	 	
    }
    public List<List> selectVarios(String query)
    {
        List<List> list = new ArrayList<List>();
       
        int columnas;
        if(conectarBase())
        {
            System.out.println("si llega hasta aca query = "+query);
            
            try
            {          
                System.out.println("Resultado -1");
                rs=stm.executeQuery(query);
                System.out.println("Resultado 0");
                ResultSetMetaData rsmd= rs.getMetaData();
                System.out.println("Resultado 1");
                columnas=rsmd.getColumnCount();
                System.out.println("Resultado 2");
                
                while(rs.next())
                {
                    List<String> listaTupla = new ArrayList<String>();
                    for(int j=1;j<=columnas;j++)
                    {
                        listaTupla.add(rs.getArray(j).toString());
                        System.out.println("Resultado 5 ---->>> "+ rs.getArray(j).toString());
                    }
                    list.add(listaTupla);
                }
                desconectar();
                //System.out.println("Resultado "+resultado.get(1));
                
                return list;
            }
            catch(Exception e)
            {
                desconectar();
                System.out.println("Se presentó el siguiente Error: "+e);
                return null;
            }
        }
        return null;	 	
    }
    
//    public String insert(String tabla,List list)
//    {
//        String devuelve="";
//        int resultado=3;
//        String query="insert into "+tabla+" values("+list.get(0);
//        for(int i=1;i<list.size();i++)
//        {
//            query+=","+list.get(i);          
//        }
//        query+=")";
//        System.out.println("query insert "+query);
//        if(conectarBase())
//        {
//            System.out.println("si llega hasta aca query = "+query);
//            
//            try
//            {     
//                con.setAutoCommit(false);
//                stm=con.createStatement();
//                System.out.println("Resultado -1");
////                resultado=stm.executeUpdate(query);
//                System.out.println("Resultado 0");
//               if(!(stm.executeUpdate(query)==pstm.EXECUTE_FAILED))
//               {
//                   con.commit();
//                   devuelve="Registro almacenado correctamente";
//               }
//               else
//               {
//                   devuelve="No se pudo almacenar el registro";
//               }
//               this.desconectar();             
//                //System.out.println("Resultado "+resultado.get(1));
//                
//              
//            }
//            catch(Exception e)
//            {
//                System.out.println("Se presentó el siguiente Error: "+e);
//                devuelve="No se pudo almacenar el registro Por la Siguiente Razon: "+e;
//                try
//                {
//                    con.rollback();
//                }
//                catch(Exception ee)
//                {
//                    devuelve=devuelve+" -- "+ee;
//                }
//                this.desconectar();
//            }
//            System.out.println("resultado---- "+resultado);
//        }
//        return devuelve;	 	
//    }
//    public String update(String tabla,List list,String condicion)
//    {
//        String devuelve="";
//        
//        //obtinene las columnas de la tabla
//        List <String> columnas=new ArrayList <String>();
//        if(conectarBase())
//        {
//            try{
//                rs=stm.executeQuery("select * from "+tabla+" where "+condicion);
//                rs.next();
//                ResultSetMetaData rsmt=rs.getMetaData();
//                for(int i=1;i<=rsmt.getColumnCount();i++)
//                {
//                    System.out.println("Entra "+rsmt.getColumnTypeName(i)+" label -->> "+rsmt.getColumnLabel(i));
//                    columnas.add(rsmt.getColumnName(i));
//                }                
//            }
//            catch(Exception e)
//            {
//                System.out.println("Error en ResultSetMetaData "+e);
//                this.desconectar();
//            }
//            if(!columnas.isEmpty())
//            {
//                String query="update "+tabla+" set "+columnas.get(0)+"="+list.get(0);
//                for(int i=1;i<list.size();i++)
//                {
//                    query+=", "+columnas.get(i)+" = "+list.get(i);          
//                }
//                query+=" where "+condicion;
//                System.out.println("query update "+query);
//                try
//                {     
//                    con.setAutoCommit(false);
//                    stm=con.createStatement();
//                    System.out.println("Resultado -1");
//    //                resultado=stm.executeUpdate(query);
//                    System.out.println("Resultado 0");
//                    if(!(stm.executeUpdate(query)==pstm.EXECUTE_FAILED))
//                    {
//                        con.commit();
//                        devuelve="Registro actualizado correctamente";
//                    }
//                    else
//                    {
//                        devuelve="No se pudo actualizar el registro";
//                    }
//                    this.desconectar();             
//                    //System.out.println("Resultado "+resultado.get(1));
//                }
//                catch(Exception e)
//                {
//                    System.out.println("Se presentó el siguiente Error: "+e);
//                    devuelve="No se pudo actualizar el registro Por la Siguiente Razon: "+e;
//                    try
//                    {
//                        con.rollback();
//                    }
//                    catch(Exception ee)
//                    {
//                        devuelve=devuelve+" -- "+ee;
//                    }
//                    this.desconectar();
//                }
//                System.out.println("resultado---- actualizado");
//            }
//            else
//            {
//                this.desconectar();  
//            }
//        }        
//        return devuelve;	 	
//    }
//    public boolean delete(String tabla, String campo, String condicion)
//    {
//        try
//        {
//            if(this.conectarBase())
//            {
//                String query="DELETE FROM "+tabla+" WHERE "+campo+"="+condicion;
//                System.out.println("query delete "+query);
//                stm.executeUpdate(query);
//                this.desconectar();  
//                return true;
//            }
//        }
//        catch(SQLException e)
//        {
//            System.out.println("ERROR AL ELIMINAR: "+e);
//            this.desconectar();  
//            return false;
//        }
//        return false;
//    }
    
    ////////////////////////////////////////////////////////////77
    public boolean commit()
    {
        try
        {  
            con.commit(); 
            return true;
        }
        catch(Exception e)
        {
            return false;
        }
    }
    public boolean rollback()
    {
        try
        { 
            con.rollback();
            return true;
        }
        catch(Exception e)
        {
            return false;
        }
    }
    public String insert(String tabla,List list,boolean commit)
    {
        String devuelve="";
        int resultado=3;
        String query="insert into "+tabla+" values("+list.get(0);
        for(int i=1;i<list.size();i++)
        {
            query+=","+list.get(i);          
        }
        query+=")";
        System.out.println("query insert "+query);
        if(conectarBase())
        {
            System.out.println("si llega hasta aca query = "+query);
            
            try
            {     
                con.setAutoCommit(false);
                stm=con.createStatement();
                System.out.println("Resultado -1");
//                resultado=stm.executeUpdate(query);
                System.out.println("Resultado 0");
               if(!(stm.executeUpdate(query)==pstm.EXECUTE_FAILED))
               {
                   if(commit)
                   {
                        this.commit();   
                   }
                   devuelve="Registro almacenado correctamente";
               }
               else
               {
                   devuelve="No se pudo almacenar el registro";
               }
               if(commit)
               {
                    this.desconectar();       
               }
                //System.out.println("Resultado "+resultado.get(1));
            }
            catch(Exception e)
            {
                System.out.println("Se presentó el siguiente Error: "+e);
                devuelve="No se pudo almacenar el registro Por la Siguiente Razon: "+e;
                try
                {
                    if(commit)
                    {
                        this.commit();
                    }
                }
                catch(Exception ee)
                {
                    devuelve=devuelve+" -- "+ee;
                }
                if(commit)
                {
                    this.desconectar();
                }
            }
            System.out.println("resultado---- "+resultado);
        }
        return devuelve;	 	
    }
    
    public String update(String tabla,List list,String condicion, boolean commit)
    {
        String devuelve="";
        
        //obtinene las columnas de la tabla
        List <String> columnas=new ArrayList <String>();
        if(conectarBase())
        {
            try{
                rs=stm.executeQuery("select * from "+tabla+" where "+condicion);
                rs.next();
                ResultSetMetaData rsmt=rs.getMetaData();
                for(int i=1;i<=rsmt.getColumnCount();i++)
                {
                    System.out.println("Entra "+rsmt.getColumnTypeName(i)+" label -->> "+rsmt.getColumnLabel(i));
                    columnas.add(rsmt.getColumnName(i));
                }                
            }
            catch(Exception e)
            {
                System.out.println("Error en ResultSetMetaData "+e);
                if(commit)
                {
                    this.desconectar();
                }
            }
            if(!columnas.isEmpty())
            {
                String query="update "+tabla+" set "+columnas.get(0)+"="+list.get(0);
                for(int i=1;i<list.size();i++)
                {
                    query+=", "+columnas.get(i)+" = "+list.get(i);          
                }
                query+=" where "+condicion;
                System.out.println("query update "+query);
                try
                {     
                    con.setAutoCommit(false);
                    stm=con.createStatement();
                    System.out.println("Resultado -1");
    //                resultado=stm.executeUpdate(query);
                    System.out.println("Resultado 0");
                    if(!(stm.executeUpdate(query)==pstm.EXECUTE_FAILED))
                    {
                        if(commit)
                        {
                            this.commit();
                        }
                        devuelve="Registro actualizado correctamente";
                    }
                    else
                    {
                        devuelve="No se pudo actualizar el registro";
                    }
                    if(commit)
                    {
                        this.desconectar();             
                    }
                    //System.out.println("Resultado "+resultado.get(1));
                }
                catch(Exception e)
                {
                    System.out.println("Se presentó el siguiente Error: "+e);
                    devuelve="No se pudo actualizar el registro Por la Siguiente Razon: "+e;
                    try
                    {
                        if(commit)
                        {
                            this.rollback();
                        }
                    }
                    catch(Exception ee)
                    {
                        devuelve=devuelve+" -- "+ee;
                    }
                    if(commit)
                    {
                        this.desconectar();             
                    }
                }
                System.out.println("resultado---- actualizado");
            }
            else
            {
                devuelve="|";
                if(commit)
                {
                    this.desconectar();             
                } 
            }
        }        
        return devuelve;	 	
    }
    public boolean delete(String tabla, String campo, String condicion,boolean commit)
    {
        try
        {
            if(this.conectarBase())
            {
                con.setAutoCommit(false);
                stm=con.createStatement();               
                String query="DELETE FROM "+tabla+" WHERE "+campo+"="+condicion;
                System.out.println("query delete "+query);
                stm.executeUpdate(query);
                if(commit)
                {
                    this.commit();
                    this.desconectar();             
                }                 
                return true;
            }
        }
        catch(Exception e)
        {
            System.out.println("ERROR AL ELIMINAR: "+e);
            if(commit)
            {
                try{
                this.rollback();
                this.desconectar();   
                }
                catch(Exception ae)
                {}
            }   
            return false;
        }
        return false;
    }
}










//codigo obsoleto
//                    System.out.println("Resultado 3");
//                    for(int j=0;j<columnas;j++)
//                    {
//                        if(rs.getObject(j+1)==null)
//                        {
//                            System.out.println("Resultado 4");
//                            list.add(j,rs.getString(j+1));
//                            System.out.println("Resultado 5 ---->>>"+ rs.getString(j+1));
//                        }
//                        else
//                        {
//                            list.add(j,rs.getObject(j+1).toString());
//                            System.out.println("Resultado 6 ---->>>"+ (String)rs.getObject(j+1));
//                        }         
//                    }

//    public String insert(String tabla,List list)
//    {
//        String devuelve="";
//        System.out.println("Tabla "+tabla);
//        if(this.conectarBase())
//        {
//            try
//            {
//               con.setAutoCommit(false);
//               String cadena="insert into "+tabla+" " +
//                             "values(";
//               for(int i=0;i<list.size()-1;i++)
//                   cadena+="?,";
//               cadena+="?)";
//               PreparedStatement pstm;
//                System.out.println("Esto almacena "+cadena+" "+con.isClosed());
//               pstm=con.prepareStatement(cadena);
//               for(int i=0;i<list.size();i++)
//               {
//                   pstm.setObject(i+1,list.get(i));
//                   System.out.println("list.get(i) "+i+" dato "+list.get(i));
//               }
//               System.out.println("Esto almacena "+cadena);
//               if(!(pstm.executeUpdate()==pstm.EXECUTE_FAILED))
//               {
//                   con.commit();
//                   devuelve="Registro almacenado correctamente";
//               }
//               else
//               {
//                   devuelve="No se pudo almacenar el registro";
//               }
//               this.desconectar();
//            }
//            catch(Exception e)
//            {
//                System.out.println("Se presentó el siguiente Error: "+e);
//                devuelve="No se pudo almacenar el registro Por la Siguiente Razon: "+e;
//                try
//                {
//                    con.rollback();
//                }
//                catch(Exception ee)
//                {
//                    devuelve=devuelve+" -- "+ee;
//                }
//                this.desconectar();
//            }
//            return devuelve;   
//        }
//        else
//        {
//            return "No se pudo establecer la Conexión con la Base de Datos";
//        }
//        
//    }
//   